package com.micolor.logr.runtime.annotation;

import com.micolor.logr.runtime.util.DateFormatUtil;
import lombok.Data;

import java.lang.annotation.*;

/**
 * @author EvanGe
 * @Type LogField.java
 * @Desc
 * @date 2024/7/2 14:28
 */
@Target(ElementType.FIELD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface LogField {
    /**
     * 注解名称
     * @return
     */
    String value();

    /**
     * 是否是业务主键
     */
    boolean isBizId() default false;

    /**
     * 是否是业务主键对应的描述 <br>
     * 举例 <br>
     * 业务主键为用户编号（使用了@isBizId注解）， <br>
     * 主键对应的描述则是 用户名称，该属性可以添加@isBizDesc注解进行标识。 <br>
     * @return
     */
    boolean isBizDesc() default false;

    /**
     * 目标字段 <br>
     * 特别的业务主键 <br>
     * 主要描述该日志修改针对的哪些业务主键。<br>
     * 比如订单修改日志可能需要给用户看到，那么就可以在订单的客户字段中添加isTarget注解进行标识。<br>
     *
     * @return
     */
    boolean isTarget() default false;

    /**
     * enumTrans
     * 枚举类型的转译获取字符串，默认为空 <br>
     * 此字符串需要在配置文件的logr.enums项中存在，否则将报错 <br>
     * @return
     */
    String enumTrans() default "";

    /**
     * 标记枚举类型是精确的还是模糊的 <br>
     * 举例：<br>
     * 当枚举信息可以通过定值查询翻译的，可以视为精确的。返回结果是键值对，如：客户编号和客户名称 <br>
     * 当枚举信息通过参数查询出来的是列表，如查询颜色color这样的类型查询出一个结果集（list）那么这个枚举就是模糊的 <br>
     * 影响内容：<br>
     *
     * enumPrecision为true时：在对枚举转换接口实现类传入的参数为切面的第二个结果参数(resultMap)
     * enumPrecision为false时：在对枚举转换接口实现类传入参数即为配置项中的参数。如 <br>
     *  @LogField(value = "用户状态",enumTrans = "dict:sys_yes_no",enumPrecision = false)
     *  传入参数即为dict:sys_yes_no
     * @return
     *
     */
    boolean enumPrecision() default  false;

    /**
     * 日期转换的格式，默认为【YYYY-MM-DD hh:mm:ss】
     * 添加该注解的属性会被DateFormantUtil类进行转换
     * @return
     */
    String dateFormat() default "";

    /**
     * 是否是创建时间
     * @return
     */
    boolean isCreateTime() default false;

    /**
     * 是否是更新时间
     * @return
     */
    boolean isUpdateTime() default false;

    /**
     * 是否是创建人
     * @return
     */
    boolean isCreateOperator() default false;

    /**
     * 是否是更新人
     * @return
     */
    boolean isUpdateOperator() default false;

    /**
     * 是否是分表关键字段 <br>
     * 可以多个字段加此注解表示该字段是分表关键字段
     *
     * @return
     */
    boolean isShardingField() default false;

}
